﻿using System;
using System.Data;
using SiGeCoPre.Presupuesto_BL;
using SiGeCoPre.Presupuesto_DAO;
using SiGeCoPre.Presupuesto_DTO;
using SiGeCoPre.Presupuesto_Entities;
using SiGeCoPre.Presupuesto_Factory;
using SiGeCoPre.Presupuesto_Excepcion;
using SiGeCoPre.Presupuesto_Util;

namespace SiGeCoPre.Presupuesto_BLIMPL
{
    /// <summary>
    /// Clase que implementa BLClientesCiudades
    /// </summary>
    class BLIMPLClientesCiudades:Presupuesto_BL.BLClientesCiudades
    {
        DAOClientesCiudades createClienteCiudad = DAOFactoryPresupuesto.createClienteCiudad();
        BLClientes createCliente = BLFactoryPresupuesto.createCliente();
        BLCiudades createCiudad = BLFactoryPresupuesto.createCiudad();

        /// <summary>
        /// Guarda un cliente asociado a una ciudad
        /// </summary>
        /// <param name="cliCiu">Objeto con los datos de un cliente y la ciudad asociada</param>
        /// <returns>Devuelve true si fue ingresado correctamente o false si falló</returns>
        public bool saveClienteCiudad(clientesCiudadesDTO cliCiu)
        {
            Boolean correcto = false;

            try
            {
                clientesDTO c = createCliente.getCliente(cliCiu.Nombre);
                ciudadesDTO ciu = createCiudad.getCiudad(cliCiu.Ciudad);

                if (null != c && null != ciu)
                {
                    Boolean insertado = createClienteCiudad.saveClienteCiudad(c.ID, ciu.ID);

                    if (insertado)
                    {
                        correcto = true;
                    }    
                }

            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return correcto;
        }

        /// <summary>
        /// Modifica un cliente asociada a una ciudad
        /// </summary>
        /// <param name="cliCiu">Objeto con los datos de un cliente y la ciudad asociada</param>
        /// <param name="id">Determina el cliente a modificar</param>
        /// <returns>Devuelve true si fue modificado correctamente o false si falló</returns>
        public bool updateClienteCiudad(clientesCiudadesDTO cliCiu, int id)
        {
            Boolean correcto = false;

            try
            {
                clientesCiudades cc = createClienteCiudad.getClienteCiudad(id);
                clientesDTO c = createCliente.getCliente(cliCiu.Nombre);
                ciudadesDTO ciu = createCiudad.getCiudad(cliCiu.Ciudad);

                if (null != cc && null != c && null != ciu)
                {
                    Boolean modificado = createClienteCiudad.updateClienteCiudad(c.ID, ciu.ID, cc.ID);

                    if (modificado)
                    {
                        correcto = true;
                    }
                }
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return correcto;
        }

        /// <summary>
        /// Elimina un cliente y su ciudad
        /// </summary>
        /// <param name="c">Objeto con los datos de un cliente a eliminar</param>
        /// <returns>Devuelve true si fue eliminado correctamente o false si falló</returns>
        public bool deleteClienteCiudad(clientesDTO c)
        {
            Boolean correcto = false;

            try
            {
                DataTable cc = createClienteCiudad.getAllClienteCiudad();

                if (null != cc)
                {
                    int id = Convert.ToInt16(cc.Select("Nombre = '" + c.Nombre + "'")[0]["id"].ToString());

                    Boolean eliminado = createClienteCiudad.deleteClienteCiudad(id);

                    if (eliminado)
                    {
                        correcto = true;
                    }    
                }
                
            }
            catch (Exception ex)
            {

                correcto = false;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }
            return correcto;
        }

        /// <summary>
        /// Lista los clientes y sus ciudades
        /// </summary>
        /// <returns>Devuelve una tabla con los clientes y sus ciudades</returns>
        public DataTable getAllClienteCiudad()
        {
            DataTable listadoClienteCiudad = null;

            try
            {
                DataTable clientesCiudades = createClienteCiudad.getAllClienteCiudad();

                if (null != clientesCiudades)
                {
                    listadoClienteCiudad = clientesCiudades;
                }
            }
            catch (Exception ex)
            {

                listadoClienteCiudad = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return listadoClienteCiudad;
        }

        /// <summary>
        /// Obtiene un cliente y su ciudad
        /// </summary>
        /// <param name="nombreCliente">Determina el cliente a obtener</param>
        /// <returns>Devuelve un objeto clienteCiudad</returns>
        public clientesCiudadesDTO getClienteCiudad(String nombreCliente)
        {
            clientesCiudadesDTO cc = null;

            try
            {
                 DataTable clienteCiudades = createClienteCiudad.getAllClienteCiudad();
                 int id = Convert.ToInt16(clienteCiudades.Select("Nombre = '" + nombreCliente + "'")[0]["id"].ToString());
                 clientesCiudades cliCiu = createClienteCiudad.getClienteCiudad(id);

                 if (null != cliCiu)
                 {
                     cc = new clientesCiudadesDTO();
                     cc.ID = cliCiu.ID;
                     cc.Activo = cliCiu.Activo;
                     cc.Ciudad = cliCiu.Ciudad;
                     cc.CodPostal = cliCiu.CodPostal;
                     cc.Contacto = cliCiu.Contacto;
                     cc.Cuit = cliCiu.Cuit;
                     cc.Direccion = cliCiu.Direccion;
                     cc.Mail = cliCiu.Mail;
                     cc.Nombre = cliCiu.Nombre;
                     cc.Pais = cliCiu.Pais;
                     cc.Provincia = cliCiu.Provincia;
                 }
            }
            catch (Exception ex)
            {

                cc = null;
                Texto.escribirLog(ex.Message);
                throw new BLException(ex.Message);
            }

            return cc;
        }
    }
}
